iT邦幫忙

2022 iThome 鐵人賽

DAY 7
0
DevOps

Golang X DevOps系列 第 7

Day07 - 用程式幫你寫出工人智慧的 Test

  • 分享至 

  • xImage
  •  

Unit Testing

測試又是一個大坑 我們這邊只講大概的概念 網路上有很多大大對 Unit Testing 有更詳細的介紹

  • 那為甚麼我們需要測試ㄋ,在大多時候( 寫OJ、寫學校派的程式回家作業)你會在寫完的時候測試自己的程式是不是出輸出正確且符合要求,當然沒有否定這種測試方法,工人智慧到現今都還是有效的方法。但假如你今天替你的 Code 增加了一些功能,不管有沒有跟以前的 function 有所牽扯,你能保證你新的 Code 不會對整體造成影響嗎?

  • 單元測試就是幫我們完成這些事情,在檢查新的程式的時候,同時也確保整體不會受到影響,能夠正常的運作

  • 要創檔案的時候記得要幫新檔案增加 _test.go 的結尾 這樣在使用 go test 的時候 他才會知道說這個檔案包含 test function

  • 資料夾長相

Project/
├── modules_example/         
│    ├──go.mod
│    ├──greeting_test.go     --- 放 unit test 的地方
│    └──greeting.go
└── call_module/             
     ├──go.mod
     └──main.go

  • greeting_test.go 增加下面這一些東西

package greeting

import (
	"regexp"
	"testing"
)

// TestGreetName 會呼叫 greet.go 確認輸入字串後是不是會和預期輸入相同
func TestGreetName(t *testing.T) {
	name := "Iron man"
	want := regexp.MustCompile(`\b` + name + `\b`) //MustCompile會幫你後面的字串 compile 成正則表達式
	msg, err := Greet("Iron man")
	if !want.MatchString(msg) || err != nil {
		t.Fatalf(`Greet("Iron man") = %q, %v, want match for %#q, nil`, msg, err, want)
	}
}

// TestGreetEmpty 會呼叫 greet.go 確認輸入空白後是不是真的會返回錯誤
func TestGreetEmpty(t *testing.T) {
	msg, err := Greet("")
	if msg != "" || err == nil {
		t.Fatalf(`Greet("") = %q, %v, want "", error`, msg, err)
	}
}

  • 我們創了兩個函式 一個用來測試正常輸入 另一個用來測試錯誤時他會不會正確地抓住 error
  • 在 Golang 中 , Unit test 的 function 名稱格式為 TestName ,而Name可以替換成我們想要測試function的名稱(在範例中 我把 Name 替換成了 GreetName)
  • 而在傳入參數的部分是一個在 testing package 的指標參數 t ,它是用來回報和紀錄你的Unit testing 結果的

Go to test

  • 接著我們試試測試吧

  • 在CMD輸入 go test

go test
  • 理論上應該會跑出J個成功畫面 跑出來就代表說 程式的輸出跟你預期的結果一樣
  • 假如你想要獲得更詳細的資訊 可以幫他加 -v 的參數
  • 結果會列出所有 test 的結果

稍稍把它改壞

  • 我今天把傳入的參數改為Bronze man ,但我預期中會出現Iron man的字串,明顯不符合,那這樣 Unit testing 會產生錯誤 告訴你說 這不是你所設定的預期解

  • 這樣 有沒有對 Testing 有了一丁點的認識R
    https://ithelp.ithome.com.tw/upload/images/20220916/20151327p1u6747pOE.png


上一篇
Day06 - 抓出錯誤和處理錯誤
下一篇
Day08 - 寫出屬於你自己的 Tool, it's cool.
系列文
Golang X DevOps30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言